package Packaging_Basic_types_BigDecimal;/*
 *
 * @author 陈粒
 * @version 创建时间：2021/7/13 11:50
 */
/**
 * BigDecimal类:
 * Java在java.math包中提供的API类BigDecimal，用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数，
 * 但在实际应用中，可能需要对更大或者更小的数进行运算和处理。
 * 用途：
 * 1.解决浮点数计算精度不准确问题
 * 注意点：
 * 一般用String类型作为参数
 * 最好不要用double类型作为构造函数的参数，不然还是有不精确现象
 * double转String，直接拼个空串就行
 * BigDecimal可以传double或者string类型的参数
 * BigDecimal所创建的是对象，故我们不能使用传统的+、-、*、/等算术运算符直接对其对象进行数学运算，而必须调用其相对应的方法。
 * 方法中的参数也必须是BigDecimal的对象。构造器是类的特殊方法，专门用来创建对象，特别是带有参数的对象。
 */

import java.math.BigDecimal;

public class Bigdecimal {
    public static void main(String[] args) {
        BigDecimal a = new BigDecimal(12.2);//a的值为12.199999999999999289457264239899814128875732421875
        //这是因为12.2无法准确的表达为double类型
        System.out.println("a的值为："+a);
        BigDecimal b = new BigDecimal("0.2");//可以准确的表达为0.2
        System.out.println("b的值为"+b);
        BigDecimal c1 = a.add(b);//add方法，加法
        System.out.println("add方法："+c1);
        BigDecimal c2 = a.subtract(b);//sub方法，减法
        System.out.println("sub方法："+c2);
        BigDecimal c3 = a.multiply(b);//multiply方法，乘法
        System.out.println("multiply方法："+c3);
        BigDecimal c4 = a.divide(b);//divide方法,除法，被除数精确度太高会出现算术类异常
        System.out.println("divide方法："+c4);
        String s = a.toString();//toString方法
        System.out.println("toString方法："+s);
        double c5 = a.doubleValue();//将BigDecimal对象中的值转换成double类型
        System.out.println("转换为double类型："+c5);
        float c6=a.floatValue();//将BigDecimal对象中的值转换成float类型
        System.out.println("转换为float类型："+c6);
        int c7=a.intValue();//将BigDecimal对象中的值转换成int类型
        System.out.println("转换为int类型："+c7);
        long c8=a.longValue();//将BigDecimal对象中的值转换成long类型
        System.out.println("转换为long类型："+c8);
        /**
         * ROUND_HALF_UP 四舍五入,五入 如:4.4结果是4; 4.5结果是5
         * ROUND_HALF_DOWN 五舍六入,五不入 如:4.5结果是4; 4.6结果是5
         * ROUND_HALF_EVEN 公平舍入(银行常用)
         * 比如:在5和6之间,靠近5就舍弃成5,靠近6就进位成6,如果是5.5,就找偶数,变成6
         * ROUND_UP 直接进位,不算0.1还是0.9,都进位
         * ROUND_DOWN 直接舍弃,不算0.1还是0.9,都舍弃
         * ROUND_CEILING(天花板) 向上取整,取实际值的大值
         * 朝正无穷方向round 如果为正数，行为和round_up一样，如果为负数，行为和round_down一样
         * ROUND_FLOOR(地板) 向下取整,取实际值的小值
         * 朝负无穷方向round 如果为正数，行为和round_down一样，如果为负数，行为和round_up一样
         */
        BigDecimal f = new BigDecimal("2.225667").setScale(4, BigDecimal.ROUND_DOWN);
        //newScale是保留的小数位数，这里为4
        System.out.println(f);
    }
}